

#ifndef UC_GECINT2D_H
#define UC_GECINT2D_H

#include "zadesk.h"
#include "zgegbl.h"
#include "zgeent2d.h"
#include "zgeponc2d.h"
#include "zgeintrvl.h"
#pragma pack (push, 8)

class UcGeCurve2d;

class  
GE_DLLEXPIMPORT
UcGeCurveCurveInt2d : public UcGeEntity2d
{

public:

    UcGeCurveCurveInt2d ();
    UcGeCurveCurveInt2d (const UcGeCurve2d& curve1, const UcGeCurve2d& curve2,
                         const UcGeTol& tol = UcGeContext::gTol );
    UcGeCurveCurveInt2d (const UcGeCurve2d& curve1, const UcGeCurve2d& curve2,
                         const UcGeInterval& range1, const UcGeInterval& range2,
                         const UcGeTol& tol = UcGeContext::gTol);
    UcGeCurveCurveInt2d (const UcGeCurveCurveInt2d& src);

    const UcGeCurve2d  *curve1          () const;
    const UcGeCurve2d  *curve2          () const;
    void               getIntRanges     (UcGeInterval& range1,
                                         UcGeInterval& range2) const;
    UcGeTol            tolerance        () const;

    int                numIntPoints     () const;
    UcGePoint2d        intPoint         (int intNum) const;
    void               getIntParams     (int intNum,
                                         double& param1, double& param2) const;
    void               getPointOnCurve1 (int intNum, UcGePointOnCurve2d&) const;
    void               getPointOnCurve2 (int intNum, UcGePointOnCurve2d&) const;
    void			   getIntConfigs    (int intNum, UcGe::UcGeXConfig& config1wrt2, 
                                         UcGe::UcGeXConfig& config2wrt1) const;
    ZSoft::Boolean     isTangential     (int intNum) const;
    ZSoft::Boolean     isTransversal    (int intNum) const;
    double             intPointTol      (int intNum) const;
    int                overlapCount     () const;
	ZSoft::Boolean	   overlapDirection () const;
    void               getOverlapRanges (int overlapNum,
                                         UcGeInterval& range1,
                                         UcGeInterval& range2) const;

    void               changeCurveOrder ();

    UcGeCurveCurveInt2d& orderWrt1  ();    
    UcGeCurveCurveInt2d& orderWrt2  ();

    UcGeCurveCurveInt2d& set        (const UcGeCurve2d& curve1,
                                     const UcGeCurve2d& curve2,
                                     const UcGeTol& tol = UcGeContext::gTol);
    UcGeCurveCurveInt2d& set        (const UcGeCurve2d& curve1,
                                     const UcGeCurve2d& curve2,
                                     const UcGeInterval& range1,
                                     const UcGeInterval& range2,
                                     const UcGeTol& tol = UcGeContext::gTol);

    UcGeCurveCurveInt2d& operator = (const UcGeCurveCurveInt2d& src);
};

#pragma pack (pop)
#endif
